//获取节点的孩子节点
function getChildren(record, panel) {
    if (record.get('leaf') == false && record.get('isHas') == 0) {
        var id = record.get('id');
        var baseUrl=panel.getChildrenUrl + '/' + id;
        var url=panel.pattern==1||panel.pattern==2?baseUrl+'/'+currentUserId:baseUrl;
        Ext.Ajax.request({
            url: url,
            method: 'get',
            async: false, // ASYNC 是否异步( TRUE 异步 , FALSE 同步)
            success: function (response, opts) {
                var obj = Ext.decode(response.responseText);
                Ext.each(obj, function (node) {// 获得数据之后先将title的值赋值给text
                    node.text = node[panel.store.proxy.textField];
                    if((panel.pattern==1||panel.pattern==2)&&node.childrenCount==0)//如果是测试计划的模式并且这个节点的可显示节点数量等于0则将此文件夹设置为不可展开
                    	node.expandable=false;
                });
                record.appendChild(obj);
                if (record.data.leaf == false && record.data.expanded == false)
                    record.set('expanded', true);
                record.set("isHas", 1);
            },
            failure: function (response, opts) {
            	var obj = Ext.decode(response.responseText);
            	if(obj.code==401||obj.code==402||obj.code==403)
            		Ext.Msg.alert("错误", obj.message);
            	else
            		Ext.Msg.alert("错误", "该功能暂时不可用！");
            }
        });
    }
}

// 从store中移除该节点
function removeItem(panel, item) {
    var parentId = item.data.parentId;
    //console.log('儿子：'+panel.store.getNodeById(parentId).hasChildNodes());
    item.remove();// 将该节点及其子节点从store中移除
    if (panel.pattern==0&&parentId != 'root'
        && !panel.store.getNodeById(parentId).hasChildNodes())//因为extJS的bug:如果有n个子节点那么childNodes数组的长度就是2n
        panel.store.getById(parentId).set('leaf', true);

}

// 添加最顶层节点
function addTopClick(panel) {
    var thisPanel = panel.up('treepanel');
    var leftTreeItemId = Ext.create("MyApp.data.MyModelX").data.id
        .replace(/-/g, "");// 生成树节点Id
    var record = {
        id: leftTreeItemId,
        text: '新节点',
        leaf: true,
        author:currentUserId,
        parentId: 'root',
        isCreate: 1
    }// 构造新节点数据
    thisPanel.getRootNode().appendChild(record);// 将该节点添加到根节点之下
    thisPanel.getSelectionModel().select(
        thisPanel.store.getById(leftTreeItemId));// 定位到新建节点
    Ext.getCmp('centerRegion').removeAll(false);// 先移除原有的items,不然直接添加会叠加,如果设置为true就是会自动销毁之前的组件，之后就无法在使用这个组件了
    thisPanel.resertForm();// 将对应表单的值清空
    thisPanel.showForm();// 将对应的表单显示到中心页面
}

//添加主题文件夹
function addSubjectFloder(panel,pattern){
	var thisPanel = panel.up('treepanel');
    var item = thisPanel.getSelectionModel().getSelected();// 得到被选择的行的数组.
    var parentId='root';
    if(item.length>0){
    	if (item.items[0].data.isCreate == 1){
        	Ext.Msg.alert("错误", "请选择非新建节点");
        	return;
        }
    	if(!item.items[0].data.leaf)//如果选中了叶子节点的话，就直接加在根节点下
    		parentId=item.items[0].data.id;
    }
    var leftTreeItemId = Ext.create("MyApp.data.MyModelX").data.id
        .replace(/-/g, "");// 生成树节点Id
    var record = {
        id: leftTreeItemId,
        text: pattern==1?'新主题':'新测试集',
        leaf: false,
        author:currentUserId,
        parentId: parentId,
        expandable:false,
        isCreate: 1
    }// 构造新节点数据
    if(parentId=='root')
    	thisPanel.getRootNode().appendChild(record);// 将该节点添加到根节点之下
    else{
    	item.items[0].appendChild(record);// 将新节点插入该节点之下
    	item.items[0].data.expandable=true;//添加子节点之后要把箭头给他
    	item.items[0].expand();// 展开父节点
    }
    thisPanel.getSelectionModel().select(
        thisPanel.store.getById(leftTreeItemId));// 定位到新建节点
    Ext.getCmp('centerRegion').removeAll(false);// 先移除原有的items,不然直接添加会叠加,如果设置为true就是会自动销毁之前的组件，之后就无法在使用这个组件了
    thisPanel.resertForm();// 将对应表单的值清空
    thisPanel.showForm();// 将对应的表单显示到中心页面
}

// 添加子节点
function addChildClick(panel) {
    var thisPanel = panel.up('treepanel');
    var item = thisPanel.getSelectionModel().getSelected();// 得到被选择的行的数组.
    if (item.length == 0)
        Ext.Msg.alert("错误", "请选择节点");
    else if (item.items[0].data.isCreate == 1)
        Ext.Msg.alert("错误", "请选择非新建节点");
    else if(item.items[0].data.author!=currentUserId)
    	Ext.Msg.alert("错误", "你无此权限添加");
    else if(item.items[0].data.status==2)
    	Ext.Msg.alert("错误", "审核中的节点无法修改");
    else {
        var leftTreeItemId = Ext.create("MyApp.data.MyModelX").data.id.replace(
            /-/g, "");// 生成树节点Id
        //getChildren(item.items[0], thisPanel);// 不能这样执行，不然在未展开的情况下去添加节点会跑到上面去
        if (item.items[0].data.leaf == true)// 如果是叶子节点则将其变为非叶子节点再操作
            item.items[0].set('leaf', false);
        var record = {
            id: leftTreeItemId,
            text: '新节点',
            leaf: true,
            author:currentUserId,
            parentId: item.items[0].data.id,
            isCreate: 1
        }// 构造新节点数据
        item.items[0].appendChild(record);// 将新节点插入该节点之下
        item.items[0].expand();// 展开该节点,这个会自动触发beforeitemexpand函数
        item.items[0].data.isHas = 1;//因为已经自动展开过了，所以设置使其再次点击后不再去获取子节点
        thisPanel.getSelectionModel().select(
            thisPanel.store.getById(leftTreeItemId));// 定位到新建节点
        Ext.getCmp('centerRegion').removeAll(false);// 先移除原有的items,不然直接添加会叠加,如果设置为true就是会自动销毁之前的组件，之后就无法在使用这个组件了
        thisPanel.resertForm();// 将对应表单的值清空
        thisPanel.showForm();// 将对应的表单显示到中心页面
    }
}
//添加测试计划
function addTestDesign(panel,pattern){
	var thisPanel = panel.up('treepanel');
    var item = thisPanel.getSelectionModel().getSelected();// 得到被选择的行的数组.
    if (item.length == 0||item.items[0].data.leaf)
        Ext.Msg.alert("错误", pattern==1?"请选择主题文件夹":'请选择测试集文件夹');
    else if (item.items[0].data.isCreate == 1)
        Ext.Msg.alert("错误", "请选择非新建节点");
    else{
    	var leftTreeItemId = Ext.create("MyApp.data.MyModelX").data.id.replace(
                /-/g, "");// 生成树节点Id
    	// if(item.items[0].data.childrenCount>0)//如果这个节点下面有可以显示的节点的话
    	// 	//getChildren(item.items[0], thisPanel);//不能这样执行，不然在未展开的情况下去添加节点会跑到上面去
    	var record = {
                id: leftTreeItemId,
                text: '新节点',
                leaf: true,
                author:currentUserId,
                parentId: item.items[0].data.id,
                isCreate: 1
            }// 构造新节点数据
    	item.items[0].appendChild(record);// 将新节点插入该节点之下
    	item.items[0].data.expandable=true;//添加子节点之后要把箭头给他
        item.items[0].expand();// 展开该节点，这个会自动触发beforeitemexpand函数
        item.items[0].data.isHas = 1;//因为已经自动展开过了，所以设置使其再次点击后不再去获取子节点
        thisPanel.getSelectionModel().select(
            thisPanel.store.getById(leftTreeItemId));// 定位到新建节点
        if(pattern==2){//如果是测试执行的菜单新建之前要把store清空，不然到时添加执行记录就堆栈溢出了
        	testRunLogStepStore.removeAll();
    		testRunlogStore.removeAll();
        }
        Ext.getCmp('centerRegion').removeAll(false);// 先移除原有的items,不然直接添加会叠加,如果设置为true就是会自动销毁之前的组件，之后就无法在使用这个组件了
        thisPanel.resertForm();// 将对应表单的值清空
        thisPanel.showForm();// 将对应的表单显示到中心页面
    }
}

// 删除节点
function deleteClick(panel) {
    var thisPanel = panel.up('treepanel');
    var item = thisPanel.getSelectionModel().getSelected();// 得到被选择的行的数组.
    if (item.length == 0)
        Ext.Msg.alert("错误", "请选择节点");
    else if(item.items[0].data.isCreate!=1&&item.items[0].data.author!=currentUserId)
    	Ext.Msg.alert("错误", "你无此权限删除");
    else if(item.items[0].data.status==2)
    	Ext.Msg.alert("错误", "审核中的节点无法删除");
    else {
        Ext.Msg.show({
            title: '提示',
            message: '你确认要删除了吗?',
            buttons: Ext.Msg.YESNO,
            icon: Ext.Msg.QUESTION,
            fn: function (btn) {
                if (btn === 'yes') {
                    if (item.items[0].data.isCreate == 0) {// 如果是从后台拿的就去后台删除
                        Ext.Ajax.request({
                            url: thisPanel.deleteUrl + '/' + item.items[0].data.id + '/' + currentUserId,
                            method: 'delete',
                            async: false, // ASYNC 是否异步( TRUE 异步 , FALSE 同步)
                            success: function (response, opts) {
                                removeItem(thisPanel, item.items[0]);
                                Ext.getCmp('centerRegion').removeAll(false);// 先移除原有的items,不然直接添加会叠加,如果设置为true就是会自动销毁之前的组件，之后就无法在使用这个组件了
                            },
                            failure: function (response, opts) {
                            	var obj = Ext.decode(response.responseText);
                            	if(obj.code==401||obj.code==402||obj.code==403)
                                	Ext.Msg.alert("错误", obj.message);
                                else 
                                    Ext.Msg.alert("错误", "该功能暂时不可用！");
                            }
                        });
                    } else {
                        removeItem(thisPanel, item.items[0]);// 刚刚新建但没有储存到后台的就直接从store移除即可
                        Ext.getCmp('centerRegion').removeAll(false);// 先移除原有的items,不然直接添加会叠加,如果设置为true就是会自动销毁之前的组件，之后就无法在使用这个组件了
                    }
                }
            }
        });
    }
}

// 将拖动的节点放到目标节点下面
function putNodeInto(view, record, store,dropHandlers) {
    var dragNode = view.dragNode;
    if (view.isAble == 1 && dragNode.data.id != record.data.id && dragNode.data.id != record.data.parentId&&!((view.up('treepanel').pattern==1||view.up('treepanel').pattern==2)&&record.data.leaf)) {//防止节点放到自己下面
        Ext.Ajax.request({
            url: view.updateParentUrl,
            method: 'put',
            async: false, // ASYNC 是否异步( TRUE 异步 , FALSE 同步)
            params: {
                id: dragNode.data.id,
                newParentId: record.data.id,
                userId:currentUserId
            },
            success: function (response, opts) {
                 record.set('expandable', true);//因为有时手动将该节点的expandable设置为false之后再将节点加入进此节点的话会无法展开，所以就每次放入节点是都把目标节点手动设置为可展开
                 if (view.toClose == 1) {//根据设置在view里的变量判断把该节点加入到新节点之后要不要把之前的父节点给收起来
                     var lastParentRecord = store.findRecord('id', view.lastParent);
                     lastParentRecord.set('expanded', false);//将之前父节点收起来
                     lastParentRecord.set('expandable', false);//将之前的父节点设置为不可展开（即没有下拉箭头）
                 }
                 if (record.data.leaf == 1) {// 如果目标节点是叶子节点的话就要做一些特殊操作,因为默认情况下叶子节点是不能放东西的，所以要自己手动加进去，其他情况则由extjs自己来插入节点
                     var itemNode = store.getNodeById(dragNode.data.id).copy(dragNode.data.id, [], true);//要先将放入节点克隆一份,第三个参数要设置为true,不然不会把子节点也复制进去
                     store.findRecord('id', dragNode.data.id).set('visible', false);//再将旧的放入节点设为不可见，因为不知为何remove对其无效
                     store.getNodeById(record.data.id).appendChild(itemNode);//将克隆的放入节点作为子节点插入目标节点下面
                     record.set('expanded', false);//将目标节点缩起，因为不知为何直接展开无法显示子节点，要手动展开才行
                     record.set('isHas', 1);//将目标节点设置不用展开之后不去后台拿数据，因为前台就有数据
                 }else//如果不是叶子节点直接用这个函数就好了
                 	dropHandlers.processDrop();
            },
            failure: function (response, opts) {
            	var obj = Ext.decode(response.responseText);
            	if(obj.code==401||obj.code==402||obj.code==403)
            		Ext.Msg.alert("错误", obj.message);
            	else
            		Ext.Msg.alert("错误", "该功能暂时不可用！");
            }
        });
        view.isAble = 0;
    }
}